/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package doc2db.interfaces.action;

import doc2db.fileWorker.ParseDocument;
import doc2db.DbManager.TablesOutput;
import doc2db.DbManager.DBManager;
import doc2db.Keey;
import doc2db.UserProp;
import doc2db.fileWorker.FileBeginer;
import doc2db.fileWorker.FileIO;
import doc2db.fileWorker.ParseHelper;
import doc2db.interfaces.mainWindow.MyFrame;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JEditorPane;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

/**
 *
 * @author yuriy
 */
public class Doc2DbAction implements ActionListener {

    protected boolean isDeleteFile = false;
    protected String fileName = "name";
    protected JTextField file;
    protected JTextField fname;
    protected JEditorPane dBSelects;
    protected JEditorPane weekendInfo;
    protected MyFrame frame;

    protected String lastTable;
    /**
     * @param fr  главное окно
     * @param f   поле с именем файла
     * @param tn  поле с названием таблици
     * @param d   dBSelects
     * @param w   weekendInfo
     */
    public Doc2DbAction(MyFrame fr, JTextField f, JTextField tn, JEditorPane d, 
            JEditorPane w) {
        frame = fr;
        file = f;
        fname = tn;
        dBSelects = d;
        weekendInfo = w;
    }

    /**
     * @param fr  главное окно
     * @param f   поле с именем файла
     * @param tn  поле с названием таблици
     * @param d   dBSelects
     * @param w   weekendInfo
     * @param b   удаляти ли данную таблицу
     */
    public Doc2DbAction(MyFrame fr, JTextField f, JTextField tn, JEditorPane d,
            JEditorPane w, boolean b) {
        this(fr, f, tn, d, w);
        isDeleteFile = b;
    }

    /**
     * @param fr  главное окно
     * @param f   поле с именем файла
     * @param tn  поле с названием таблици
     * @param d   dBSelects
     * @param w   weekendInfo
     * @param fn  имя файла
     */
    public Doc2DbAction(MyFrame fr, JTextField f, JTextField tn, JEditorPane d, 
            JEditorPane w, String fn) {
        this(fr, f, tn, d, w);
        fileName = fn;
    }

    /**
     * @param fr  главное окно
     * @param f   поле с именем файла
     * @param tn  поле с названием таблици
     * @param d   dBSelects
     * @param w   weekendInfo
     * @param fn  имя файла
     * @param b   удаляти ли данную таблицу
     */
    public Doc2DbAction(MyFrame fr, JTextField f, JTextField tn, JEditorPane d,
            JEditorPane w, String fn, boolean b) {
        this(fr, f, tn, d, w, b);
        fileName = fn;
    }

    protected void submitFile() {
        lastTable = null;

        //запуск обработчика документов
        ParseDocument pd = new ParseDocument(file.getText());
        if (!pd.parse()) {            //разбираем документ
            errMsg("Невозможно обработать файл - не читаемый документ.\n"
                    + "Попробуйте пересохранить документ и попробывать сново.");
            return;
        }

        pd.refactor().refactor();   //преобразовываем таблици

        final UserProp up = new UserProp();
        //запуск БД работника
        DBManager dbm = new DBManager(up.getURL(), up.getUserProp());

        String s = checFile(new File(file.getText()));

        //проверка таблиц в БД
        Doc2DbCheckTab ch = new Doc2DbCheckTab(s);
        for (int i = 0; i < pd.getTables().size(); i++) {
            if (!ch.checTabInDb(pd.getTables().get(i), i + 1)) {
                return;
            }
        }

        //работа с БД
        TablesOutput to = new TablesOutput(pd.getTables(), dbm);
        
        //если нужно заносить данные
        if (!isDeleteFile) {
            to.createDBTables(s);
            to.insertValues();
            dbm.close();
        }//если нужно удалять данные
        else if (isDeleteFile) {
            to.dropDBTables(s);
            dbm.close();
        }

        //заносим информацию на панели вывода
        String str2 = dBSelects.getText();
        str2 = "\n\n\n" + to.getSelects();
        dBSelects.setText(str2);
        
        lastTable = to.getTableName();
    }

    protected void showTabl(String to) {
        ShowTableAction showTableAction = new ShowTableAction(weekendInfo, dBSelects);
        String tN = "" + to;
        showTableAction.res = "" + tN.substring(1, tN.length() - 1);
        showTableAction.actionPerformed(null);
    }

    /**
     * проверка и создание конфигурационных файлов
     */
    protected void chekResFiles() {
        String str = FileBeginer.resurse_users_usersFolder + Keey.sp + UserProp.user + Keey.sp;
        if (!new File(str + FileBeginer.metaTemplatesName).exists()) {
            FileIO.createFile(FileBeginer.getMetaTemplates(), str + FileBeginer.metaTemplatesName);
        }
        if (!new File(str + FileBeginer.templatesName).exists()) {
            FileIO.createFile(FileBeginer.getTemplates(), str + FileBeginer.templatesName);
        }
    }

    /**
     * 
     * @param f
     * @return
     */
    protected String checFile(File f) {
        return f.getName()
                .replace("/", "_")
                .replace("\\", "_")
                .replace(".", "_")
                .replace("\\s+", "_");
    }

    protected boolean chek() {
        if (file.getText().length() < 6) {
            return true;
        }
        if (!new File(file.getText()).exists()) {
            return true;
        }
        if (!Keey.isConnected) {
            return true;
        }
        return false;
    }

    public String getFileName() {
        return fileName;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //file.setText(file.getText().trim());

        if (Keey.tableName && fname.getText().trim().length() > 1) {
            Keey.tableNameValue = fname.getText()
                    .trim()
                    .replace('\n', '_')
                    .replace(' ', '_')
                    .replace(',', '_')
                    .replace('.', '_')
                    .replace('.', '_')
                    .replace('/', '_')
                    .replace('\\', '_');
        }

        if (chek()) {
            errMsg("Неверное имя файла");
            if (Keey.debug) {
                System.err.println("wrong file name : " + file.getText());
            }
            return;
        }

        
        frame.pane.p.setVisible(true);

        int ret = JOptionPane.OK_OPTION;
        if (! Keey.isIsMas()) {
            ret = JOptionPane.showConfirmDialog(null, "Bыполнить обработку файла ?",
                    "" + frame.pane.p.isVisible(), JOptionPane.YES_NO_OPTION);
        }

        if (ret == JOptionPane.OK_OPTION) {
            this.chekResFiles();//проверка и создание конфигурационных файлов
            try {
                this.submitFile();
            } catch (Exception exp) {
                exp.printStackTrace();
                errMsg("Произошла ошибка при обработке:\n" + exp);
            }
        }

        if (lastTable != null) {
            showTabl(lastTable);
        }

        frame.pane.p.setVisible(false);
        ParseHelper.toZeroTabCounter();
    }

    /**
     *  show error message dialog, with message - msg,
     * and title - "doc2db обработка файла"
     * @param msg message
     * @throws HeadlessException if GraphicsEnvironment.isHeadless returns true
     */
    protected void errMsg(String msg) throws HeadlessException {
        JOptionPane.showMessageDialog(null, msg, "doc2db обработка файла", 
                JOptionPane.ERROR_MESSAGE);
    }
}
